package com.sicheng.lc.lc笔试.美团篇;

import java.util.Arrays;
import java.util.Scanner;

/**
 * @author zsc
 * @version 1.0
 * @date 2022/4/30 11:19
 */
public class 小美铺路 {
    /**
     * 时间限制： 3000MS
     * 内存限制： 589824KB
     * 题目描述：
     * 小美在玩一款造桥修路的游戏。这个游戏中，小美要给一段长度为n米的道路铺路。
     * 这条道路可以看作是数轴上范围在[0,n]的连续段。
     * 小美一次性可以给一段长度为w米的道路进行铺路（已经铺过的一段路可以重复铺）。
     * 目前她已经给m个位置进行了铺路，第 i 个位置表示为pi
     * 表示小美给[pi , pi+w]这一段已铺好路。她想知道至少还要操作多少次，才能使得整条道路都被铺完？
     * 输入描述
     * 第一行三个空格隔开的正整数m,n,w；
     * <p>
     * 接下来一行m个正整数p1,p2,... ,pm
     * <p>
     * 1≤m≤104，1≤w≤n≤109 ，0≤pi≤n-w
     * <p>
     * pi不一定两两不同。
     * <p>
     * 输出描述
     * 输出一个整数，表示使得整条道路都被铺完的最少次数。
     * <p>
     * <p>
     * 样例输入
     * 2 10 3
     * 3 5
     * 样例输出
     * 2
     * <p>
     * 提示
     * 根据输入，两段道路[3,6]，[5,8]已被铺好，合起来就是[3,8]已被铺好，还需要铺[0,3]和[8,10]，可以选择铺[0,3]和[7,10]两段。
     */

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int m = scanner.nextInt();
        long n = scanner.nextInt();
        long w = scanner.nextInt();
        int res = 0;
        int[] nums = new int[m];
        for (int i = 0; i < m; i++) {
            nums[i] = scanner.nextInt();
        }
        Arrays.sort(nums);

        long left = nums[0];
        long right = left + w;
        for (int i = 1; i < m; i++) {
            if (nums[i] > right) {
                long l = (nums[i] - right) / 3;
                res += (nums[i] - right) % 3 == 0 ? l : l + 1;
                left = nums[i];
                right = left + w;
            } else {
                right = Math.max(right, nums[i] + w);
            }
            if (right >= n) {
                break;
            }
        }

        if (nums[0] > 0) {
            res += nums[0] % 3 == 0 ? nums[0] / 3 : nums[0] / 3 + 1;
        }
        if (right < n) {
            long l = (n - right) / 3;
            res += (n - right) % 3 == 0 ? l : l + 1;
        }
        System.out.println(res);
    }
}
